package com.ruoyi.framework.config;

import java.util.Properties;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;

import static com.google.code.kaptcha.Constants.*;

/**
 * 验证码配置类，用于生成图形验证码的 Bean 实例。
 *
 * @author ruoyi
 */
@Configuration
public class CaptchaConfig {

    /**
     * 创建默认样式的验证码生成器 Bean。
     * <p>
     * 该方法配置了验证码的基本属性，包括边框、颜色、尺寸、字体等，并设置了验证码在 Session 中存储的键名。
     * 同时指定了图片渲染效果（阴影）以及字符相关设置。
     * </p>
     *
     * @return 配置完成的 DefaultKaptcha 实例
     */
    @Bean(name = "captchaProducer")
    public DefaultKaptcha getKaptchaBean() {
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();

        // 是否有边框，默认为 true
        properties.setProperty(KAPTCHA_BORDER, "yes");

        // 验证码文本字符颜色，默认为黑色
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");

        // 验证码图片宽度，默认为 200
        properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");

        // 验证码图片高度，默认为 50
        properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");

        // 验证码文本字符大小，默认为 40
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");

        // 设置验证码在 session 中保存的 key 名称
        properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");

        // 验证码文本字符长度，默认为 5
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");

        // 验证码文本字体名称列表
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");

        // 图片干扰样式：使用阴影效果
        properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");

        // 创建验证码配置对象，使用传入的属性配置进行初始化
        Config config = new Config(properties);
        // 将配置对象设置到默认验证码生成器中
        defaultKaptcha.setConfig(config);
        // 返回配置完成的验证码生成器实例
        return defaultKaptcha;

    }

    /**
     * 创建数学表达式类型的验证码生成器 Bean。
     * <p>
     * 此验证码显示一个简单的数学运算题（如：1+2=?），用户需要计算结果输入验证。
     * 包含自定义的颜色、尺寸、字体及干扰元素设置，并指定使用无噪点模式与阴影图像处理方式。
     * </p>
     *
     * @return 配置完成的 DefaultKaptcha 实例，支持数学表达式形式的验证码
     */
    @Bean(name = "captchaProducerMath")
    public DefaultKaptcha getKaptchaBeanMath() {
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();

        // 是否有边框，默认为 true
        properties.setProperty(KAPTCHA_BORDER, "yes");

        // 边框颜色 RGB 值
        properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90");

        // 验证码文本字符颜色
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue");

        // 验证码图片宽度
        properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");

        // 验证码图片高度
        properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");

        // 验证码文本字符大小
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35");

        // 设置验证码在 session 中保存的 key 名称
        properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath");

        // 自定义验证码文本生成器，用于生成数学表达式
        properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ruoyi.framework.config.KaptchaTextCreator");

        // 字符之间的间距
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3");

        // 文本字符总长度（适用于数学表达式）
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6");

        // 验证码文本字体名称列表
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");

        // 噪点颜色
        properties.setProperty(KAPTCHA_NOISE_COLOR, "white");

        // 使用无噪点干扰实现类
        properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");

        // 图片干扰样式：使用阴影效果
        properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");

        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}
